/*
 * graph.h
 *
 *  Created on: 22/04/2013
 *      Author: jose
 */

#ifndef GRAPH_H_
#define GRAPH_H_

#include "misc.h"


/************************************************************
 * ESTRUCTURAS
 ************************************************************/

/*
 * Nodo-fila que representa a una URL ligada a un nodo cabecera
 */
struct node_st
{
	unsigned head;				// posición en el array que representa al grafo de una
								//		URL ligada al headnode
	unsigned arc;				// Cantidad de repeticiones del arco headnode -> nodo hijo
	float conf;					// Confianza de la transición
	struct node_st * link;		// referencia a otra URL ligada a la URL del nodo cabecera
};
typedef struct node_st Node;

/*
 * Nodo cabecera
 */
struct headnode_st
{
	String * url;			// datos de la URL del nodo cabecera
	unsigned appareances;	// contador cantidad de apariciones en las sesiones
	unsigned nodes_len;	// cantidad de nodos ligados al headnode
	Node * link;			// Referencia al primer nodo hijo
};
typedef struct headnode_st Headnode;

/*
 * Grafo, se representa como una lista de adyacencia
 */
struct graph_adj_list_st
{
	Headnode * heads;		// Array de elementos de cabecera
	unsigned empty;		// Indice del siguiente headnode vacío (para ir insertando)
	unsigned heads_len;	// Cantidad de headnodes en el grafo
	unsigned graph_len; 	// Cantidad total de nodos (headnodes e hijos) en el grafo
};
typedef struct graph_adj_list_st Graph_Adj_List;


/************************************************************
 * FUNCIONES
 ************************************************************/
//Graph_Adj_List *
//adj_list_create_with_urls(const unsigned len, String ** urls);

Graph_Adj_List *
adj_list_create_with_urls(const unsigned len, String * urls);

Graph_Adj_List *
adj_list_create_no_urls(const unsigned len);


Graph_Adj_List *
adj_list_update_next_empty_headnode(Graph_Adj_List * gr, const String * str);


Node *
headnode_add_node(Graph_Adj_List * gr, const String * url_head, const String * url_to);

unsigned
adj_list_search_headnode(Graph_Adj_List * gr, const String * url);

/* TODO esto deberia traer una lista enlazada de todos los nodos encontrados, no la primera
 * coincidencia nada mas
 */
Node *
search_node_all_headnodes(Graph_Adj_List * gr, const String *url);


Node *
headnode_search_node(Graph_Adj_List * gr, unsigned index, const String * url);

void
update_headnode_appareances(Graph_Adj_List * gr, unsigned index);


void
adj_list_print_headnodes(Graph_Adj_List * gr);

void
adj_list_print(Graph_Adj_List * gr);

void
free_graph(Graph_Adj_List * gr);

#endif /* GRAPH_H_ */
